#include <avr/io.h>
#include <stdlib.h>
#include <stdio.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>
#include "uart.h"
#include "drive.h"
#include "sensors.h"

char sendStr[16];

// прерывание тамера для отправки данных
 ISR(TIMER1_OVF_vect)
{
	
	PORTB ^= (1<<PB5);
	int L = SensorL();
	int R = SensorR();
	sprintf(sendStr,"L%iR%iE",L, R);
	USART_putstring(sendStr);
// reinit counter
	TCNT1H = 36;
	TCNT1L = 244;
}


// Прерывание по получению данных о движении
ISR(USART_RX_vect)
	{
//	int L, R;	
	uint8_t data_in = USART_receive();
	
		switch (data_in)
		{
			
		case '0':
//			L = SensorL();
//			R = SensorR();
//			sprintf(sendStr,"L%iR%iE",L, R);
//			USART_putstring(sendStr);
			break; 
		case '1':
			
			break;
		case '2':
			BACKWARD;
			break;
		case '3':
			
			break;
		case '4':
			LEFT;
			break;
		case '5':
			STOP;
			break;
		case '6':
			RIGHT;
			break;
		case '7':
			
			break;
		case '8':
			FORWARD;
			break;
		case '9':
			
			break;
					
		}  
	
	}

//инициализация таймера
void Timer1_init()
{
	// Timer1 settings: ~ 200000 ticks (100 us)
//	TCCR1B = (1<<CS11); // prescaler = 8
//	TCCR1B = (1<<CS12); // prescaler = 256
	TCCR1B = (1<<CS11) | (1<<CS10); // prescaler = 64


//	TCCR1B = 0; // prescaler = 0
	// init counter
	TCNT1H = 36; // Remaining Ticks
	TCNT1L = 244;  //Owerflows
	TIMSK1 = (1<<TOIE1); // Timer1 Overflow Interrupt Enable
//TODO: enable irq: capt
//TODO: enable irq: compa
//TODO: enable irq: compb
}
// инициализация портов
void PortInit (void)
{
/*
out:
PD4(D4) - M1 направление вращения
PD5(D5) - M1 скорость вращения (0 - нет вращения, 1 - полная скорость)
PD7(D7) - M2 направление вращения
PD6(D6) - M2 скорость вращения (0 - нет вращения, 1 - полная скорость)

PB0(D8)
PB1(D9)
PB2(D10)
PB3(D11)
PB4(D12)
PB5(D13) - светодиод

in:

PD0(D0)
PD1(D1)
PD2(D2) - кнопка S6
PD3(D3) - кнопка S7

PC0(A0)
PC1(A1)
PC2(A2)
PC3(A3)
PC4(A4)  сенсор правый
PC5(A5)  сенсор левыы
ADC6(A6)?
ADC7(A7)?
*/
	// 1 - out
	// 0 - in
	// инициализация порта 'B'
	DDRB =  0b00111111;	// PB7=quartz PB6=quartz PB5=out=светодиод PB4=out PB3=out PB2=out PB1=out PB0=out
	PORTB = 0b00000000;	// All Low 
	
	// инициализация порта 'C'
	DDRC =  0b0000000;	// PC6=reset PC5=in (сенсор) PC4=in (сенсор) PC3=in PC2=in PC1=in PC0=in 
	PORTC = 0b0000000;	// All Low
	
	// инициализация порта 'D'
	DDRD =  0b11110000;	// PD7=out=M2 PD6=out=M2 PD5=out=M1 PD4=out=M1 PD3=in=кнопка S7 PD2=in=кнопка_S6 PD1=in PD0=in 
	PORTD = 0b00000000;	// All Low
}

int main()
{
	PortInit ();
	USART_init();
	Timer1_init();
// циклом передаем данные о датчиках	
	sei();
	while (1)
	{
	}
	return 0;
}